--
-- Trigger que graba o modifica un prexart por un parametro de comprobante al guardar el comprobane.
-- Graba en el prexart del articulo el valor de ImpoLibre1 si este es <> 0
-- El valor queda grabado en la variable de precios que indique el parámetro.
-- La función sirve de ejemplo para otras necesidades de conservar un valor para algo.
-- Esta es la oficial, se puede extender a ImpoLibre2..4 pero si cambia sustancialmente para un cliente
-- hay que hacer una en el esquema cliente con un nuevo trigger ad hoc
-- El nombre de la variable de precios debe tener 4 caracteres
--

CREATE OR REPLACE FUNCTION public.tg_artm_impo1_pre()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
vParametro   varchar;
vCodPre      varchar;
vIdPre	     integer;

BEGIN
IF NEW.ImpoLibre1 is not NULL THEN
    vParametro := 'PrecioImpoLibre1=';
    vCodPre 	:= '';
    SELECT CASE WHEN POSITION(vParametro in com.param) > 0 
		THEN SUBSTRING(com.param, POSITION(vParametro in com.param) + length(vParametro), 4)
		ELSE '' END INTO vCodPre
	FROM COM
	INNER JOIN COMM ON COMM.TIPOCOM = COM.TIPO
	WHERE COMM.ID = NEW.IDCOMM;
  
    IF TRIM(COALESCE(vCodPre,'')) <> '' THEN 
	  vIdPre := (SELECT id FROM pre WHERE cod = vCodPre);
	  DELETE FROM prexart WHERE idart = NEW.idart and idpre = vIdpre;
	  INSERT INTO prexart (idart, idpre, valor) VALUES (NEW.idart, vIdPre, NEW.ImpoLibre1);
	END IF;
END IF;	

RETURN NEW;
	
END;

$BODY$;

ALTER FUNCTION public.tg_artm_impo1_pre()
    OWNER TO abacouser;
GRANT EXECUTE ON FUNCTION public.tg_artm_impo1_pre() TO abacouser;
GRANT EXECUTE ON FUNCTION public.tg_artm_impo1_pre() TO PUBLIC;

CREATE TRIGGER artm_040_ins_upd_impo1_pre
    AFTER INSERT OR UPDATE
    ON public.artm
    FOR EACH ROW
    EXECUTE PROCEDURE public.tg_artm_impo1_pre();

--
SELECT aaversion('498.05','498.04');
--

